package com.igeek.oo;


/**
 * 汽车类，类是对象的模板
 *  构造函数的总结：
 *      1.Java默认提供了无参的构造函数
 *      2.自己手动写构造函数之后，那个默认提供的构造函数就被覆盖了
 *      3.构造函数可以重载，参数列表可以自定义
 *      4.构造函数可以私有化，可以把访问修饰符改为 private，使得无法调用构造函数，从而无法创建对象
 *      5.构造函数的主要用途，就是给属性赋值
 */
public class Car {

    /**
     * 构造方法，同样可以重载，可以有不同的参数列表
     * 如果创建了一个有参的构造函数，但是不想通过传参的形式创建对象，
     * 那么就需要，再手动的创建一边，无参的构造方法
     *
     */
    public Car() {}

    /**
     * 无参的，公共有的构造方法
     * 语法：
     *      访问修饰符 类名(参数列表){
     *
     *      }
     */
    public Car(String brand){
        /*
            this关键字，表示的是当前对象
            this.brand 当前对象属性的调用
         */
        this.brand = brand;
    }

    public Car(String light,int turn){
        this.light = light;
        this.turn = turn;
    }
    //这里就不是构造函数的重载
    /*public Car(String light){
        this.light = light;
    }*/

    private String brand;

    private int turn;

    private String light;

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public int getTurn() {
        return turn;
    }

    public void setTurn(int turn) {
        this.turn = turn;
    }

    public String getLight() {
        return light;
    }

    public void setLight(String light) {
        this.light = light;
    }
}

class CarTest{

    public static void main(String[] args) {

        /*
            构造方法：
            1.Java默认帮我们写了，无参的共有的构造函数，当我们创建对象的时候 new 类名()
            实际上就去底层执行了该类的无参构造函数
            2.当我们自己写了有参的构造函数的时候，就会覆盖掉默认提供的那个无参的构造方法，
            再创建对象的时候，就需要根据构造方法的参数列表进行，参数的传递
            3.构造方法的，重载问题：
                同一个类中，有相同的方法名，但是不同的参数列表，就称之为重载
                如果写了多个构造函数的重载，再创建对象的时候，更多样化
                参数列表不同的含义：参数类型、数量不一样，与形参的名称无关
         */
        Car car = new Car() ;
        /*
            将属性封装之后，可以使用setter方法，给参数赋值
         */
        car.setBrand("brz");
        car.setTurn(4);

        Car car1 = new Car("bwm");
        System.out.println(car1.getBrand());
    }
}
